package com.qzsoft.zhjd.materiel.modules.materielapi.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.qzsoft.jeemis.common.utils.Result;
import com.qzsoft.jeemis.common.validator.ValidatorUtils;
import com.qzsoft.zhjd.common.enums.BizCode;
import com.qzsoft.zhjd.common.utils.ResultUtils;
import com.qzsoft.zhjd.materiel.modules.materielapi.aop.ExtResult;
import com.qzsoft.zhjd.materiel.modules.materielapi.aop.MaterielApi;
import com.qzsoft.zhjd.materiel.modules.materielapi.aop.MaterielApiUpdate;
import com.qzsoft.zhjd.materiel.modules.materielapi.dto.MaterielItemBindDto;
import com.qzsoft.zhjd.materiel.modules.materielapi.dto.MaterielItemUnbindDto;
import com.qzsoft.zhjd.materiel.modules.materielapi.dto.MaterielItemUpdateDto;
import com.qzsoft.zhjd.materiel.modules.materielapi.dto.MaterielItemViewDto;
import com.qzsoft.zhjd.materiel.modules.materielapi.dto.PlatformDataSendDto;
import com.qzsoft.zhjd.materiel.modules.materielapi.dto.SupplierAndProjectSaveDto;
import com.qzsoft.zhjd.materiel.modules.materielapi.dto.SupplierAndProjectViewDto;
import com.qzsoft.zhjd.materiel.modules.materielapi.dto.SysUserViewDto;
import com.qzsoft.zhjd.materiel.modules.materielapi.dto.WeightDataType;
import com.qzsoft.zhjd.materiel.modules.materielapi.service.MaterielApiService;
import com.qzsoft.zhjd.materiel.modules.materieldata.entity.MaterielDataEntity;
import com.qzsoft.zhjd.materiel.modules.materieldevice.entity.MaterielDeviceEntity;
import com.qzsoft.zhjd.materiel.modules.materieldevice.service.MaterielDeviceService;

/**
 * @ClassName MaterielApiController
 * @Description 地磅客户端接口
 * @author linhuawei
 * @since 2022-04-05
 */
@RestController
@RequestMapping("/api/externalcommu")
public class MaterielApiController {

    @Autowired
    private MaterielDeviceService materielDeviceService;

    @Autowired
    private MaterielApiService materielApiService;

    /*********************** 供应商管理开始 ******************************/

    /**
     * @Title getCooperates
     * @Description 获取发料单位列表
     * @param deviceCode 地磅编号
     * @return 发料单位列表
     */
    @MaterielApi("getCooperates")
    @GetMapping("/getCooperates")
    public ExtResult getCooperates(@RequestParam(name = "siteNO", required = false) String deviceCode) {
        // 根据编号获取磅房信息
        MaterielDeviceEntity materielDevice = materielDeviceService.getByCode(deviceCode);
        if (null == materielDevice) {
            return ExtResult.notFound();
        }

        // 获取数据
        List<SupplierAndProjectViewDto> list = materielApiService.getCooperates(materielDevice.getBaseCode());
        return ExtResult.ok(list);
    }

    /**
     * @Title saveCooperates
     * @Description 添加供应商信息
     * @return
     */
    @MaterielApiUpdate("getCooperates")
    @PostMapping("/saveCooperates")
    public Result<String> saveCooperates(String waste) {
        // 数据格式化
        SupplierAndProjectSaveDto dto = null;
        try {
            if (ObjectUtils.isNotEmpty(waste)) {
                dto = JSONObject.parseObject(waste, SupplierAndProjectSaveDto.class);
            }
        } catch (Exception e) {
            return ResultUtils.error("添加供应商数据格式错误");
        }

        // 判断对象是否为空
        if (null == dto) {
            return ResultUtils.error("数据格式错误");
        }

        // 参数校验
        ValidatorUtils.validateEntity(dto);

        // 执行添加操作
        materielApiService.saveCooperates(dto);
        return ResultUtils.ok();
    }

    /*********************** 供应商管理结束 ******************************/

    /*********************** 项目管理开始 ********************************/
    /**
     * @Title getProjectList
     * @Description 项目列表
     * @param deviceCode 地磅编号
     * @return 材料列表
     */
    @MaterielApi("getProjectList")
    @GetMapping("/getProjectList")
    public ExtResult getProjectList(@RequestParam(name = "siteNO", required = false) String deviceCode) {
        // 根据编号获取磅房信息
        MaterielDeviceEntity materielDevice = materielDeviceService.getByCode(deviceCode);
        if (null == materielDevice) {
            return ExtResult.notFound();
        }

        // 获取数据
        List<SupplierAndProjectViewDto> list = materielApiService.getProjectList(materielDevice.getBaseCode());
        return ExtResult.ok(list);
    }

    /**
     * @Title saveCooperates
     * @Description 添加项目信息
     * @return
     */
    @MaterielApiUpdate("getProjectList")
    @PostMapping("/saveProject")
    public Result<String> saveProject(String waste) {
        // 数据格式化
        SupplierAndProjectSaveDto dto = null;
        try {
            if (ObjectUtils.isNotEmpty(waste)) {
                dto = JSONObject.parseObject(waste, SupplierAndProjectSaveDto.class);
            }
        } catch (Exception e) {
            return ResultUtils.error("添加供应商数据格式错误");
        }

        // 判断对象是否为空
        if (null == dto) {
            return ResultUtils.error("数据格式错误");
        }

        // 参数校验
        ValidatorUtils.validateEntity(dto);

        // 执行添加操作
        materielApiService.saveProject(dto);
        return ResultUtils.ok();
    }

    /******************************** 项目管理结束 *********************************/

    /******************************** 操作员信息开始 *********************************/

    /**
     * @Title getOperators
     * @Description 获取用户列表
     * @param deviceCode 地磅编号
     * @return 用户列表
     */
    @MaterielApi("getOperators")
    @GetMapping("/getOperators")
    public ExtResult getOperators(@RequestParam(name = "siteNO", required = false) String deviceCode) {
        // 根据编号获取磅房信息
        MaterielDeviceEntity materielDevice = materielDeviceService.getByCode(deviceCode);
        if (null == materielDevice) {
            return ExtResult.notFound();
        }

        // 获取数据
        List<SysUserViewDto> list = materielApiService.getOperators(materielDevice.getBaseCode());
        return ExtResult.ok(list);
    }

    /******************************** 操作员信息结束 *********************************/

    /******************************** 材料字典开始 *********************************/

    /**
     * @Title getItemList
     * @Description 获取材料列表
     * @param deviceCode 地磅编号
     * @return 材料列表
     */
    @MaterielApi("getItemList")
    @GetMapping("/getItemList")
    public ExtResult getItemList(@RequestParam(name = "siteNO", required = false) String deviceCode) {
        // 根据编号获取磅房信息
        MaterielDeviceEntity materielDevice = materielDeviceService.getByCode(deviceCode);
        if (null == materielDevice) {
            return ExtResult.notFound();
        }

        // 获取数据
        List<MaterielItemViewDto> list = materielApiService.getItemList(materielDevice.getBaseCode());
        return ExtResult.ok(list);
    }

    /**
     * @Title getUnbindItemList
     * @Description 获取未绑定材料列表
     * @param deviceCode
     * @return
     */
    @GetMapping("/getUnbindItemList")
    public Result<List<MaterielItemUnbindDto>> getUnbindItemList(
            @RequestParam(name = "siteNO", required = false) String deviceCode) {
        // 根据编号获取磅房信息
        MaterielDeviceEntity materielDevice = materielDeviceService.getByCode(deviceCode);
        if (null == materielDevice) {
            return ResultUtils.error(BizCode.PARAMS_ERROR, "未找到地磅设备");
        }

        // 获取未绑定材料列表
        List<MaterielItemUnbindDto> data = materielApiService.getUnbindItemList(materielDevice.getBaseCode());
        return ResultUtils.ok(data);
    }

    /**
     * @Title bindItem
     * @Description 绑定材料信息
     * @return
     */
    @MaterielApiUpdate("getItemList")
    @PostMapping("/bindItem")
    public Result<List<String>> bindItem(String waste) {
        // 数据格式化
        MaterielItemBindDto dto = null;
        try {
            if (ObjectUtils.isNotEmpty(waste)) {
                dto = JSONObject.parseObject(waste, MaterielItemBindDto.class);
            }
        } catch (Exception e) {
            return ResultUtils.error("数据格式错误");
        }

        // 判断对象是否为空
        if (null == dto) {
            return ResultUtils.error("数据格式错误");
        }

        // 参数校验
        ValidatorUtils.validateEntity(dto);

        // 执行数据绑定操作
        List<String> errors = materielApiService.bindItem(dto);
        return ResultUtils.ok(errors);
    }

    /**
     * @Title updateItem
     * @Description 修改材料信息
     * @return
     */
    @MaterielApiUpdate("getItemList")
    @PostMapping("/updateItem")
    public Result<String> updateItem(String waste) {
        // 数据格式化
        List<MaterielItemUpdateDto> list = null;
        try {
            if (ObjectUtils.isNotEmpty(waste)) {
                list = JSONArray.parseArray(waste, MaterielItemUpdateDto.class);
            }
        } catch (Exception e) {
            return ResultUtils.error("材料数据格式错误");
        }

        // 执行材料更新
        materielApiService.updateItem(list);
        return ResultUtils.ok();
    }

    /******************************** 材料字典结束 *********************************/

    /******************************** 数据字典开始 *********************************/

    /**
     * @Title getWeightType
     * @Description 获取收发料类型
     * @param pid
     * @return
     */
    @MaterielApi("getWeightType")
    @GetMapping("/getWeightType")
    public ExtResult getWeightType() {
        List<WeightDataType> list = materielApiService.getWeightType();
        return ExtResult.ok(list);
    }

    /******************************** 数据字典结束 *********************************/

    /******************************** 磅单上传开始 ************************************/

    /**
     * @Title saveMaterielData
     * @Description 磅单数据上报
     * @param waste 磅单json数据
     * @param file  磅单图片
     * @return 磅单数据上报结果
     */
    @PostMapping("/savePlatformData")
    public Result<String> saveMaterielData(String waste, MultipartFile[] file) {
        PlatformDataSendDto dto = null;
        try {
            if (ObjectUtils.isNotEmpty(waste)) {
                dto = JSONObject.parseObject(waste, PlatformDataSendDto.class);
            }
        } catch (Exception e) {
            return ResultUtils.error("磅单数据格式错误");
        }
        if (null == dto) {
            return ResultUtils.error("磅单数据不可为空");
        }

        // 参数校验
        ValidatorUtils.validateEntity(dto);

        // 执行添加
        materielApiService.saveMaterielData(dto, file);
        return ResultUtils.ok();
    }
    
    /**
     * @Title getMaterielData
     * @Description 获取改变的磅单数据
     * @param deviceCode 地磅编号
     * @return 磅单数据
     */
    @GetMapping("/getMaterielData")
    public Result<List<MaterielDataEntity>> getMaterielData(@RequestParam(name = "siteNO", required = false) String deviceCode) {
        // 根据编号获取磅房信息
        MaterielDeviceEntity materielDevice = materielDeviceService.getByCode(deviceCode);
        if (null == materielDevice) {
            return ResultUtils.error("未知的地磅设备");
        }
        
        List<MaterielDataEntity> list = materielApiService.getMaterielData(deviceCode);
        return ResultUtils.ok(list);
    }

    /******************************** 磅单上传结束 ************************************/

}
